#include <iostream>
#include "contacts.pb.h"
#include <string>
#include <fstream>


void AddPeopleInfo(contacts::People* person)
{
    std::cout << "--------------新增联系人--------------" << std::endl;
    std::cout << "请输入联系人的姓名: ";
    std::string name;
    getline(std::cin,name);
    person->set_name(name);

    std::cout << "请输入联系人的年龄: ";
    int age;
    std::cin >> age;
    person->set_age(age);
    std::cin.ignore(256,'\n'); //清除缓冲区所有内容，直到'\n'，把'\n'删除后结束，或者清除256个字节直接结束

    for(int i = 0;;i++)
    {
        std::cout << "请输入联系人的电话: " << i+1 << "(只输入回车完成电话新增): ";
        std::string number;
        getline(std::cin,number);
        if(number.empty())
            break;
        //接收add_phone返回的phone对象
        contacts::People_Phone* phone = person->add_phone();
        phone->set_phone(number);
    }

    std::cout << "--------------添加联系人成功--------------" << std::endl;

}

int main()
{
    contacts::Contacts contacts;
    //读取通讯录文件中的联系人，没有就创建
    std::ifstream input("contacts.bin",std::ios::in | std::ios::binary);
    if(!input)
        std::cout << "contacts.bin not find, create new file" << std::endl;
    else if(!contacts.ParseFromIstream(&input)) //这个函数解决了：1.读取文件  2.反序列化到contacts
    {
        std::cerr << "Parse error" << std::endl;
        input.close();
        return -1;
    }
    //走到这里，表示通讯录对象contacts已经读取成功，不管有没有数据
    //像通讯录新加一个人的信息
    AddPeopleInfo(contacts.add_person()); //调用add_person 表示即将新加进去的person信息已经开辟好空间了
        
    //将通讯录写入文件中
    std::ofstream output("contacts.bin",std::ios::out | std::ios::binary | std::ios::trunc); //覆盖写
    if(!contacts.SerializePartialToOstream(&output)) //这个函数解决了：写入通讯录到文件 
    {
        std::cerr << "write error" << std::endl;
        input.close();
        output.close();
    }

    //走到这里，成功写入
    std::cerr << "write success" << std::endl;
    input.close();
    output.close();
    return 0;
}